package product_pkg

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/base64"
	"encoding/json"
	"fmt"
	"product_server/domain/consts"
	"product_server/domain/modle"
	"strings"
	"time"
)

// 使用HMAC-SHA256算法生成数据签名
func generateSignature(data string) string {
	// 创建HMAC哈希对象，使用预定义的密钥
	h := hmac.New(sha256.New, []byte(consts.SIGNING_KEY))
	// 写入要签名的数据
	h.Write([]byte(data))
	// 生成哈希值并编码为Base64
	return base64.URLEncoding.EncodeToString(h.Sum(nil))
}

// 生成拼团淘口令
func GenerateGroupBuyingToken(groupid, userid, productid string) (string, error) {
	//创建一个包含组ID、产品ID、用户ID和时间戳的TokenData结构体实例。
	tokendata := modle.TokenData{
		GroupID:   groupid,
		ProductID: productid,
		UserID:    userid,
		Timestamp: time.Now().Unix(),
	}
	//将TokenData结构体实例转换为JSON字符串，并处理可能的错误。
	data, err := json.Marshal(tokendata)
	if err != nil {
		return "", err
	}
	//对JSON字符串进行Base64编码。
	encoded := base64.URLEncoding.EncodeToString(data)
	//生成编码后的数据的签名，以确保数据的完整性和真实性。
	signature := generateSignature(encoded)
	//将编码后的数据和签名组合成完整的Token字符串。
	fullToken := fmt.Sprintf("%s.%s", encoded, signature)
	//添加前后缀，形成最终的淘口令格式并返回。
	return fmt.Sprintf("%s%s%s", consts.TOKEN_PERFIX, fullToken, consts.TOKEN_SUFFIX), nil
}

// 验证签名是否有效
func verifySignature(data, signature string) bool {
	// 生成期望的签名
	expectedSignature := generateSignature(data)
	// 使用安全比较函数比较两个签名
	return hmac.Equal([]byte(expectedSignature), []byte(signature))
}

// 解码淘口令，提取其中的信息
func DecodeToken(encoded string) (*modle.TokenData, error) {
	// 分割编码数据和签名部分
	parts := strings.Split(encoded, ".")
	if len(parts) != 2 {
		return nil, fmt.Errorf("无效的token格式")
	}

	dataPart := parts[0]      // 数据部分
	signaturePart := parts[1] // 签名部分

	// 验证签名，确保数据未被篡改
	if !verifySignature(dataPart, signaturePart) {
		return nil, fmt.Errorf("无效的签名")
	}

	// 解码Base64数据
	decoded, err := base64.URLEncoding.DecodeString(dataPart)
	if err != nil {
		return nil, err
	}

	// 解析JSON数据到TokenData结构
	var tokenData modle.TokenData
	if err := json.Unmarshal(decoded, &tokenData); err != nil {
		return nil, err
	}

	return &tokenData, nil
}
